/*
 * Created on 2006-3-3
 * 文件名：PageSeparate.java
 * Author: x60014950
 * 版权：Copyright 2003-2004 Huawei Tech. Co. Ltd. All Rights Reserved.
 * 描述：实现记录查询结果的分页显示
 */
package com.sunshade.common.page;

import java.io.Serializable;

/**
 * <p>
 * Title: PageSeparator
 * </p>
 * <p>
 * Description: 实现记录查询结果的分页显示，可以设置每页显示的行数，向上翻页和向下翻页，判断 当前页是否有上页和下页，是否是第一页和最后一页，可以直接设定要查看的页面。
 * </p>
 * <p>
 * 对外公共接口：getNowPage,当前的页数；getPageCount,获取总页数；getPageSize,获取每页显示的行数；
 * getRowCount,获取总行数；getSectionFoot,获得当前页第一行在总记录中的行数；getSectionTop,获得
 * 当前页末行在总记录中的行数；hasNextPage,判断是否有下一页；hasPrevPage,是否有上一页；isLastPage,
 * 是否是最后一页；isFirstPage,是否是第一页；nextPage,向下翻页；prevPage,向上翻页；setNowPage， 跳转至设定页；setPageSize,设置每页显示的行数;
 * setRowCount, 设置总行数
 * </p>
 * <p>
 * Copyright: Copyright 2003-2004 Huawei Tech. Co. Ltd. All Rights Reserved.
 * </p>
 * <p>
 * Company: huawei
 * </p>
 * 
 * @author x60014950
 * @version 1.0
 */
public class PageSeparate implements Serializable
{
    /**
     * 注释内容
     */
    private static final long serialVersionUID = 1L;
    
    /**
     * 定义每页默认显示的行数，如果用户设置错误，则使用此数值
     */
    public static final int PAGE_SIZE = 10;
    
    /**
     * 定义总行数，会在类构造时进行初始化
     */
    private int rowCount = 0;
    
    /**
     * 每页显示的行数，会在类构造时进行初始化
     */
    private int pageSize = 0;
    
    /**
     * 定义总页数
     */
    private int pageCount = 0;
    
    /**
     * 当前为第几页，从 1 开始计数,这里初始化为 0 ，此值会在类构造时进行初始化为 1
     */
    private int nowPage = 0;
    
    /**
     * 默认构建器
     */
    public PageSeparate()
    {
    }
    
    /**
     * Description: 构造函数，要求必须有两个参数：rowCount and pageSize<br>
     * [参数列表，说明每个参数用途]
     * 
     * @param rowCount
     * @param pageSize
     *            return_type
     */
    public PageSeparate(int rowCount, int pageSize)
    {
        // 如果在构造这个类时任何一个参数错误，则用参数的默认值
        // 参数的默认值为：rowCount = 0; pageSize = PAGE_SIZE;
        if ((rowCount < 0) || (pageSize < 1))
        {
            this.rowCount = 0;
            this.pageSize = PAGE_SIZE;
        }
        else
        {
            this.rowCount = rowCount;
            this.pageSize = pageSize;
        }
        
        // 计算总页数，如果返回0条记录，即rowCount为0，则pageCount的值也为0
        pageCount = (rowCount + pageSize - 1) / pageSize;
        
        // 将当前页数设置为第一页(如果有数据，则设置为1，没有数据设置为0)
        nowPage = (pageCount > 0) ? 1 : 0;
        
    }
    
    /**
     * Description: <br>
     * 设置总行数，同时要计算新的pageCount <br>
     * ◎@return rowCount 总行数
     * 
     * @param rowCount
     */
    public void setRowCount(int rowCount)
    {
        this.rowCount = rowCount;
        this.pageCount = (rowCount + pageSize - 1) / this.pageSize;
        // add by pengyi 修改删除最后一页数据时，设置nowpage为最有一页
        if (nowPage > pageCount)
        {
            nowPage = pageCount;
        }
        
        // 如果开始为0，则说明是从无到有，应该设置为1
        if ((nowPage == 0) && (pageCount != 0))
        {
            nowPage = 1;
        }
        // this.nowPage = 1;
    }
    
    /**
     * Description: <br>
     * 获得总行数 <br>
     * ◎@return rowCount 总行数
     */
    public int getRowCount()
    {
        return rowCount;
    }
    
    /**
     * Description: <br>
     * 设置每页显示的行数 <br>
     * [参数列表，说明每个参数用途]
     * 
     * @param pageSize
     *            每页显示的行数 ◎@return void
     */
    public void setPageSize(int pageSize)
    {
        this.pageSize = pageSize;
    }
    
    /**
     * Description: <br>
     * 获得每页显示的行数 <br>
     * ◎@return 每页显示的行数
     */
    public int getPageSize()
    {
        return pageSize;
    }
    
    /**
     * Description: <br>
     * 获得总页数 <br>
     * ◎@return 总页数
     */
    public int getPageCount()
    {
        return pageCount;
    }
    
    /**
     * Description: <br>
     * 判断当前页是否有下一页 <br>
     * Implement: <br>
     * 通过比较当前的页数与总页数来判断 <br>
     * [参数列表，说明每个参数用途] ◎@return 如果有下一页，返回true; 如果没有下一页，返回false
     */
    public boolean hasNextPage()
    {
        return (nowPage < pageCount) ? true : false;
    }
    
    /**
     * Description: <br>
     * 判断当前页是否有上一页 <br>
     * Implement: <br>
     * 通过比较当前页是否是第一页 <br>
     * [参数列表，说明每个参数用途] ◎@return 如果有上一页，返回true; 如果没有上一页，返回false
     */
    public boolean hasPrevPage()
    {
        return (nowPage > 1) ? true : false;
    }
    
    /**
     * Description: <br>
     * 向下翻页 <br>
     * Implement: <br>
     * 1. 判断当前页是否有下页 <br>
     * 2. 如果有下页，当前页面数加1 <br>
     * [参数列表，说明每个参数用途] ◎@return void
     */
    public boolean nextPage()
    {
        if (hasNextPage())
        {
            nowPage++;
            return true;
        }
        
        // 输出提示：已经是最后一页
        return false;
    }
    
    /**
     * Description: <br>
     * 向上翻页 <br>
     * Implement: <br>
     * 1. 判断当前页是否有上页 <br>
     * 2. 如果有上页，当前页面数减1 <br>
     * [参数列表，说明每个参数用途] ◎@return void
     */
    public boolean prevPage()
    {
        if (hasPrevPage())
        {
            nowPage--;
            return true;
        }
        
        // 输出提示：已经是第一页
        return false;
        
    }
    
    /**
     * Description: <br>
     * 判断当前页是否是第一页 <br>
     * Implement: <br>
     * 1. 当前页面数与1比较 <br>
     * [参数列表，说明每个参数用途] ◎@return 如果是第一页，返回true，否则返回false
     */
    public boolean isFirstPage()
    {
        return (nowPage == 1) ? true : false;
    }
    
    /**
     * Description: <br>
     * 判断当前页是否是最后一页 <br>
     * Implement: <br>
     * 1. 当前页面数与总页数比较；或者判断总页数是否为0 <br>
     * [参数列表，说明每个参数用途] ◎@return 如果是最后一页，返回true，否则返回false
     */
    public boolean isLastPage()
    {
        return ((pageCount == 0) || (nowPage == pageCount)) ? true : false;
    }
    
    /**
     * Description: <br>
     * 获得当前页第一行在总记录中的行数 <br>
     * Implement: <br>
     * 1. 当前页面数减1然后乘以每页显示的行数 <br>
     * [参数列表，说明每个参数用途] ◎@return 当前页第一行在总记录中的行数
     */
    public int getSectionFoot()
    {
        
        return (pageCount == 0) ? 0 : (nowPage - 1) * pageSize;
    }
    
    /**
     * Description: <br>
     * 获得当前页最后一行在总记录中的行数 <br>
     * Implement: <br>
     * 1. 当前页面第一行的行数加上每页显示的行数 <br>
     * [参数列表，说明每个参数用途] ◎@return 当前页最后一行在总记录中的行数
     */
    public int getSectionTop()
    {
        return (isLastPage()) ? rowCount : (getSectionFoot() + pageSize);
    }
    
    /**
     * Description: <br>
     * 设置当前页 <br>
     * [参数列表，说明每个参数用途] ◎@return 如果用户输入了非法的值，返回false；否则将当前页数设置为用户输入的值，并返回true
     * 
     * @param nowPage
     */
    public boolean setNowPage(int nowPage)
    {
        // 如果用户输入的值为0或者负数，或者大于总页数的值，则返回false
        if ((nowPage < 1) || (nowPage > pageCount))
        {
            return false;
        }
        this.nowPage = nowPage;
        return true;
    }
    
    /**
     * Description: <br>
     * 获得当前页数 <br>
     * ◎@return 当前数
     */
    public int getNowPage()
    {
        return nowPage;
    }
}
